package com.smiiler.skin.haoyaoshi;

import java.security.MessageDigest;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class EncoderHandler {

	private static final String ALGORITHM = "MD5";

	private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
			'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

	/**
	 * encode string
	 * 
	 * @param algorithm
	 * @param str
	 * @return String
	 */
	public static String encode(String algorithm, String str) {
		if (str == null) {
			return null;
		}
		try {
			MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
			messageDigest.update(str.getBytes());
			return getFormattedText(messageDigest.digest());
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}

	/**
	 * encode By MD5
	 * 
	 * @param str
	 * @return String
	 */
	public static String encodeByMD5(String str) {
		if (str == null) {
			return null;
		}
		try {
			MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM);
			messageDigest.update(str.getBytes());
			return getFormattedText(messageDigest.digest());
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}

	/**
	 * Takes the raw bytes from the digest and formats them correct.
	 * 
	 * @param bytes
	 *            the raw bytes from the digest.
	 * @return the formatted bytes.
	 */
	private static String getFormattedText(byte[] bytes) {
		int len = bytes.length;
		StringBuilder buf = new StringBuilder(len * 2);
		// ������ת����ʮ����Ƶ��ַ���ʽ
		for (int j = 0; j < len; j++) {
			buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
			buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
		}
		return buf.toString();
	}
	/**
	 * des  ����
	 * @param datasource
	 * @param password   ����Ҫ��8�ı���
	 * @return
	 */
	public static byte[] desCrypto(byte[] datasource, String password) {              
        try{  
        SecureRandom random = new SecureRandom();  
        DESKeySpec desKey = new DESKeySpec(password.getBytes());  
        //����һ���ܳ׹�����Ȼ�������DESKeySpecת����  
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
        SecretKey securekey = keyFactory.generateSecret(desKey);  
        //Cipher����ʵ����ɼ��ܲ���  
        Cipher cipher = Cipher.getInstance("DES");  
        //���ܳ׳�ʼ��Cipher����  
        cipher.init(Cipher.ENCRYPT_MODE, securekey, random);  
        //���ڣ���ȡ��ݲ�����  
        //��ʽִ�м��ܲ���  
        return cipher.doFinal(datasource);  
        }catch(Throwable e){  
                e.printStackTrace();  
        }  
        return null;  
	}  
	
	/**
	 * des  ����
	 * @param src
	 * @param password  ���¦����æ��Ǧ�
	 * @return
	 * @throws Exception
	 */
	private static byte[] decrypt(byte[] src, String password) throws Exception {  
        // DES�㷨Ҫ����һ�������ε������Դ  
        SecureRandom random = new SecureRandom();  
        // ����һ��DESKeySpec����  
        DESKeySpec desKey = new DESKeySpec(password.getBytes());  
        // ����һ���ܳ׹���  
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
        // ��DESKeySpec����ת����SecretKey����  
        SecretKey securekey = keyFactory.generateSecret(desKey);  
        // Cipher����ʵ����ɽ��ܲ���  
        Cipher cipher = Cipher.getInstance("DES");  
        // ���ܳ׳�ʼ��Cipher����  
        cipher.init(Cipher.DECRYPT_MODE, securekey, random);  
        // ����ʼ���ܲ���  
        return cipher.doFinal(src);  
	}  
}
